package com.example.shoputils.exception;

import com.example.shoputils.constants.HttpCode;
import com.example.shoputils.resp.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @Author 刘武贵
 * @Date 2024/2/26 23:56
 * @Description 功能描述：全局异常捕获类
 */
/**
 * @RestControllerAdvice 是 Spring 框架中用于全局处理异常的注解。
 * 当 Spring Boot 应用程序中的控制器抛出异常时，@RestControllerAdvice 注解可以捕获这些异常并统一进行处理。
 *
 * 具体来说，@RestControllerAdvice 注解结合 @ExceptionHandler、@InitBinder 和 @ModelAttribute 注解，
 * 可以实现全局性的异常处理、数据绑定和数据预处理等功能，提供了统一的方式来处理控制器抛出的异常。
 */
@RestControllerAdvice
public class RestCtrlExceptionHandler {
    private final Logger logger = LoggerFactory.getLogger(RestCtrlExceptionHandler.class);

    /**
     * 全局异常处理，统一返回状态码
     *
     * @param e 异常对象
     * @return 异常处理结果
     */
    /**
     * @ExceptionHandler 注解用于标记在 Spring MVC 控制器中的方法，用于处理特定类型的异常。当控制器中的方法抛出指定类型的异常时，
     * @ExceptionHandler 注解的方法会被调用来处理该异常。这样可以实现对特定异常类型的自定义处理逻辑，而无需在每个控制器方法中都编写异常处理代码。
     *
     * value：（别名为 exception）用于指定需要处理的异常类型，可以指定一个或多个异常类型。当有一个或多个控制器方法抛出指定类型的异常时，
     * 被 @ExceptionHandler 注解标记的方法会被调用来处理该异常。
     */
    @ExceptionHandler(Exception.class)
    public Result<String> handleException(Exception e) {
        logger.error("服务器抛出了异常：{}", e);
        return new Result<String>(HttpCode.FAILURE, "执行失败", e.getMessage());
    }
}
